//Included

#include "program.h"



//Defined

#define PORT 4245

#define closesocket(s) shutdown(s, SHUT_RDWR)




int PORT_S = PORT;/*le port du serveur*/
char * IP_S = "127.0.0.1";/*adresse ip serveur*/
char * PATH_S = "./";/*repertoire courant*/	

int semid;/*les semaphore responsable de la distrubition des threads*/
SOCKET sock = -1;
Liste * listeClients;/*liste de client connecter sur le serveur*/
filelist_t * listeFichiers;/*liste des fichiers disponnible dans le repertoire courant*/
int fd[2];/*pipe de communication entre thread client et thread serveur*/
pthread_mutex_t clientTableAccess = PTHREAD_MUTEX_INITIALIZER;/*section critique de la table de stockage des clients*/
pthread_mutex_t fileTableAccess = PTHREAD_MUTEX_INITIALIZER;/*section critique de la table de stockage des fichiers*/
pthread_mutex_t trafficTableAccess = PTHREAD_MUTEX_INITIALIZER;/*section critique de la table de stockage des traffics*/

void* f_thread_KeyListener()
{
	int csock= -1;
	sleep(rand()%3);
	//printf("je suis le thread %d %d\n",getpid(),pthread_self());
	while (1) {
		char *s = malloc (sizeof (*s) * BUFSIZ);
		char c;
		int i = 0;
		do{
			c=getchar();
			s[i] = (char)c;
			i++;
		}
		while(c!='\n');
		//Formatage de la chaine de caractere
		s[i-1]= '\0';
		handler_KeyEvents(s,&csock,IP_S,&PORT_S,semid,listeFichiers,&fileTableAccess,fd[0],fd[1]);
		sched_yield();
		
	}
	pthread_exit(NULL);
	
}
void * d_thread_serveur(binder *b){
	sleep(rand()%3);
	//printf("je suis le thread %d %d\n",getpid(),pthread_self());
	bind_serveur(b->sock,b->ip,b->port,b->path,b->semid,b->listeClients,b->listeFichiers,b->fdpipe,&clientTableAccess,&fileTableAccess,&trafficTableAccess);
	pthread_exit(NULL);
}

//Main
int main (int argc, const char * argv[]) {
	key_t clef = ftok("key",PORT);
	srand(getpid());
	semid =semget(clef,1, IPC_CREAT| 0666);	
	if(semid==-1){
		perror("semget");
	}
	if (pipe(fd)==-1) {
		perror("PIPE");
		exit(EXIT_FAILURE);
	}
	pthread_t ecouteur;/*L'ecouteur du clavier*/
	pthread_t serveur;
	int pid1 ;
	//printf("je suis le thread principale %d %d\n",getpid(),pthread_self());
	if((pid1 = pthread_create(&ecouteur, NULL,(void*)f_thread_KeyListener,NULL))==-1)
		printf("probleme pthread_create \n");

	binder * b = malloc(sizeof(binder));
	b->sock = &sock;
	b->ip = IP_S;
	b->port = PORT_S;
	b->semid = semid;
	b->listeClients = listeClients;
	b->listeFichiers = listeFichiers;
	b->fdpipe = fd[0];
	b->path = PATH_S;
	if((pid1 = pthread_create(&serveur, NULL,(void *)d_thread_serveur,b))==-1)
		printf("probleme pthread_create \n");
	changer_ordo_priorite(ecouteur, SCHED_FIFO, 3);
	changer_ordo_priorite(serveur, SCHED_RR,5);
	/*Attendre que les requetes se termine*/ 
	pthread_join(ecouteur,NULL);
	pthread_join(serveur,NULL);
	/*Destruction des semapohores*/
	semctl(semid, 0, IPC_RMID, 0);
	return 0;
}
